package cn.zjitc.quickstart.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class MyInterceptor1 implements HandlerInterceptor {
    /**
     * 🧩 一、preHandle()：请求前拦截
     * 执行时机：
     * 在 Controller 的目标方法执行 之前 调用。
     * 典型任务：
     * 任务
     * 说明
     * ✅ 权限验证
     * 判断用户是否登录或有权限访问资源，如未登录则重定向到 /login。
     * ✅ 请求日志记录
     * 记录请求 URL、IP、时间等信息用于监控或审计。
     * ✅ 防止重复提交
     * 可以使用 Token 或 Session 标记防止表单重复提交。
     * ✅ 请求参数预处理
     * 对请求参数进行统一处理，如解密、编码转换等。
     * <p>
     * 🧩 二、postHandle()：Controller 执行后，视图渲染前拦截
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException {

        System.out.println("preHandle.....");
        return true;
    }

    /**
     * 🧩 二、postHandle()：Controller 执行后，视图渲染前拦截
     * 执行时机：
     * Controller 方法执行完成之后，但 视图尚未渲染 前调用。
     * 典型任务：
     * 任务
     * 说明
     * ✅ 视图数据增强
     * 向 ModelAndView 中添加通用数据（如菜单、用户信息）。
     * ✅ 性能统计
     * 统计 Controller 执行耗时（结合 preHandle 和当前时间）。
     * ✅ 结果处理
     * 修改返回结果或视图名称（例如统一错误页面跳转）。
     * ⚠️ 注意：如果 Controller 抛出异常，此方法不会执行。
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        System.out.println("postHandle...");
    }

    /**
     * 🧩 三、afterCompletion()：整个请求完成后拦截
     * 执行时机：
     * 在整个请求结束（包括视图渲染完成）后调用，无论是否发生异常。
     * 典型任务：
     * 任务
     * 说明
     * ✅ 清理资源
     * 关闭数据库连接、释放线程本地变量（ThreadLocal）等。
     * ✅ 日志输出
     * 输出完整的请求日志，包括耗时、状态码等。
     * ✅ 异常处理
     * 捕获 Controller 或 JSP 抛出的异常并做统一处理。
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {

        System.out.println("afterCompletion....");
    }
}